Если мы перегружаем функцию, то должны перегрузить и функцию GetHashCode наоборот если заходим изменить Equals то должны перегрузить функцию получения хеш кодов. Короче взаимосвязанные они. Смотрим пример:
using System;
class MyClass
{
public override int GetHashCode()
{
return x1+x2+x3;
}
public override bool Equals(object obj)
{
MyClass o = (MyClass) obj;
if (o.GetHashCode()==this.GetHashCode())
{
if (x1 != o.x1) return false;
if (x2 != o.x2) return false;
if (x3 != o.x3) return false;
return true;
}
else return false;
}
public int x1=0;
public int x2=0;
public int x3=0;
}
class MainClass
{
public static void Main(string[] args)
{
MyClass c1 = new MyClass();
c1.x1=1;
c1.x2=1;
c1.x3=1;
MyClass c2 = new MyClass();
c2.x1=2;
c2.x2=2;
c2.x3=2;
MyClass c3 = new MyClass();
c3.x1=1;
c3.x2=1;
c3.x3=1;
if (c1.Equals(c2)) Console.WriteLine("c1=c2");
if (c1.Equals(c3)) Console.WriteLine("c1=c3");
}
}
Я создал свою функцию получения хеш кода. Конечно совсем простую и конечно много вариантов могут получить один и тот же код. Гарантия только одна, что если они не совпадают то классы точно разные. А вот если совпадают нужно еще раз все проверить, чтобы убедиться точно.
